/*
 * Copyright (C) 2018 www.missfresh.cn All rights reserved.
 *
 * Created by wangzheng@missfresh.cn on 2019-01-16.
 */

package com.dylan.历史.util.mryx;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * 和客
 * 户端兼容加密.
 */
@SuppressWarnings("all")
public class AESClientUtils {

    private static final String IV_STRING = "A-16-Byte-String";
    private static final String CHARSET = "UTF-8";

    /**
     * 加密.
     * @param content   ""
     * @param key       ""
     * @return      ""
     * @throws InvalidKeyException  ""
     * @throws NoSuchAlgorithmException ""
     * @throws NoSuchPaddingException   ""
     * @throws InvalidAlgorithmParameterException   ""
     * @throws IllegalBlockSizeException    ""
     * @throws BadPaddingException  ""
     * @throws UnsupportedEncodingException ""
     */
    public static String aesEncryptString(String content, String key) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
        byte[] contentBytes = content.getBytes(CHARSET);
        byte[] keyBytes = key.getBytes(CHARSET);
        byte[] encryptedBytes = aesEncryptBytes(contentBytes, keyBytes);
        return Base64Utils.byte2Base64(encryptedBytes);
    }

    /**
     * 解密.
     * @param content   ""
     * @param key       ""
     * @return      ""
     * @throws InvalidKeyException  ""
     * @throws NoSuchAlgorithmException ""
     * @throws NoSuchPaddingException   ""
     * @throws InvalidAlgorithmParameterException   ""
     * @throws IllegalBlockSizeException    ""
     * @throws BadPaddingException  ""
     * @throws UnsupportedEncodingException ""
     */
    public static String aesDecryptString(String content, String key) throws Exception {
        byte[] encryptedBytes = Base64Utils.base642Byte(content);
        byte[] keyBytes = key.getBytes(CHARSET);
        byte[] decryptedBytes = aesDecryptBytes(encryptedBytes, keyBytes);
        return new String(decryptedBytes, CHARSET);
    }

    public static byte[] aesEncryptBytes(byte[] contentBytes, byte[] keyBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
        return cipherOperation(contentBytes, keyBytes, Cipher.ENCRYPT_MODE);
    }

    public static byte[] aesDecryptBytes(byte[] contentBytes, byte[] keyBytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
        return cipherOperation(contentBytes, keyBytes, Cipher.DECRYPT_MODE);
    }

    private static byte[] cipherOperation(byte[] contentBytes, byte[] keyBytes, int mode) throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
        SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES");

        byte[] initParam = IV_STRING.getBytes(CHARSET);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(mode, secretKey, ivParameterSpec);

        return cipher.doFinal(contentBytes);
    }

}
